# Contributor: Sören Tempel <soeren+alpine@soeren-tempel.net>
# Contributor: Mitch Tishmack <mitch.tishmack@gmail.com>
# Maintainer: Sören Tempel <soeren+alpine@soeren-tempel.net>
pkgname=ghc
# XXX: GHC is tightly coupled with community/cabal-stage0.
# Only update to GHC versions supported by cabal bootstrapping setup.
pkgver=9.8.2
pkgrel=1
# GHC version used to bootstrap the build. This is relevant for the
# bootstrapping of the Hadrian build system used by GHC these days.
_bootstrapver=9.8.2
# Normal non rc candidate
_urlprefix="$pkgver"
_pkgprefix="$pkgname-$pkgver"
_llvmver=15
pkgdesc="The Glasgow Haskell Compiler"
url="https://haskell.org/ghc"
arch="aarch64 x86_64"
# Note ghc's license is basically BSD-3. If you'd like to know more visit:
# * https://www.haskell.org/ghc/license
# * https://ghc.haskell.org/trac/ghc/wiki/Licensing
license="BSD-3-Clause"
# Note that ghc is sensitive to the version of llvm used.
#
# Ref: https://ghc.haskell.org/trac/ghc/wiki/Status/GHC-8.0.1
#      https://ghc.haskell.org/trac/ghc/wiki/ImprovedLLVMBackend
#
# Without libffi-dev in $depends linking of software via ghc(1) fails.
depends="gmp-dev libffi-dev perl gcc>=6.2.1 llvm$_llvmver"
# ghc is self-hosted, so we need ghc to build ghc. ghc-bootstrap is provided by
# this aport (see below).
makedepends_build="$pkgname-bootstrap~=$_bootstrapver
	autoconf automake binutils libffi-dev ncurses-dev xz coreutils grep py3-sphinx"
makedepends_host="linux-headers musl-dev zlib-dev gmp-dev binutils-dev
	libffi-dev ncurses-dev"
makedepends="$makedepends_build $makedepends_host"
checkdepends="python3 diffutils bash"
# XXX: ghc-bootstrap is a hack to allow this abuild to depend on itself.
# Adding "ghc" to makedepends would not work, because abuild implicitly removes
# $pkgname and $subpackages from the abuild's dependencies.
provides="$pkgname-bootstrap=$pkgver-r$pkgrel"
subpackages="$pkgname-doc $pkgname-dev"
install="$pkgname.post-install"
ldpath="/usr/lib/ghc-$pkgver"
options="!strip ldpath-recursive"  # we strip it manually in build()
source="https://downloads.haskell.org/~ghc/$_urlprefix/$_pkgprefix-src.tar.xz
	https://downloads.haskell.org/~ghc/$_urlprefix/$_pkgprefix-testsuite.tar.xz
	$pkgname-$pkgver-hadrian-ghc-$_bootstrapver.tar.gz::https://dev.alpinelinux.org/archive/ghc-hadrian/ghc-$pkgver/ghc-$_bootstrapver-hadrian-bootstrap-source.tar.gz

	ghc-self-bootstrap.patch
	fix-T21035.patch
	fix-T7060.patch
	"

# Adjust path for specific LLVM version target by GHC.
export PATH="$PATH:/usr/lib/llvm$_llvmver/bin"

case "$CARCH" in
aarch64)
	# 116 more failures
	options="$options !check"
	;;
esac

_hadrian="hadrian/bootstrap/_build/bin/hadrian"
_hadrian_args="-j${JOBS:-1}"

if [ "$CBUILD" != "$CTARGET" ]; then
	_hadrian_args="$_hadrian_args --docs=none --flavour=quickest"
else
	_hadrian_args="$_hadrian_args --docs=no-sphinx-pdfs --flavour=release"
fi

build() {
	# Build the hadrian build system.
	#
	# See:
	#   * https://gitlab.haskell.org/ghc/ghc/-/tree/master/hadrian/bootstrap
	#   * https://www.haskell.org/ghc/blog/20220805-make-to-hadrian.html
	cd hadrian/bootstrap/
	./bootstrap.py -w /usr/bin/ghc -s "$srcdir"/$pkgname-$pkgver-hadrian-ghc-$_bootstrapver.tar.gz

	# NOTE: ghc build system requires host == build, and it ends up
	# compiling the cross-compiler (stage1) and cross-compiling with
	# that the native compiler (stage2)
	cd "$builddir"
	./configure \
		--build=$CBUILD \
		--host=$CBUILD \
		--target=$CTARGET \
		--prefix=/usr \
		--with-system-libffi \
		--disable-ld-override \
		LD=${LD:-ld}

	# Switch llvm-targets from unknown-linux-gnueabihf->alpine-linux
	# so we can match the llvm vendor string alpine uses
	sed -i -e 's/unknown-linux-gnueabihf/alpine-linux/g' llvm-targets
	sed -i -e 's/unknown-linux-gnueabi/alpine-linux/g' llvm-targets
	sed -i -e 's/unknown-linux-gnu/alpine-linux/g' llvm-targets

	"$_hadrian" $_hadrian_args
}

check() {
	# Broken tests are known upstream to be broken on musl.
	# See: https://gitlab.haskell.org/ghc/ghc/-/commit/cdd45a61ecfc34d3610dff4b654f1bca5dcb6829
	"$_hadrian" $_hadrian_args test --skip-perf --test-speed=fast \
		--broken-test=encoding004 --broken-test=T10458 \
		--broken-test=linker_unload_native	
}

package() {
	local ghclib="$pkgdir/usr/lib/ghc-$pkgver/lib"
	local newpath path target

	# Hadrian's install command doesn't support DESTDIR.
	# Hence, we need to install via the bindist.
	"$_hadrian" $_hadrian_args binary-dist-dir
	cd _build/bindist/ghc-*
	# Need to re-run configure.
	# See: https://gitlab.haskell.org/ghc/ghc/-/issues/22058
	./configure --prefix=/usr \
		--with-system-libffi \
		--disable-ld-override \
		LD=${LD:-ld}
	make DESTDIR="$pkgdir" RECACHE_PACKAGE_DB=NO install

	install -Dm644 "$builddir/LICENSE" \
		"$pkgdir/usr/share/licenses/$pkgname/LICENSE"

	cd "$pkgdir"

	# Fixup install tree if needed.
	if [ -d usr/lib/$CTARGET-ghc-$pkgver ]; then
		# different location
		ghclib="usr/lib/$CTARGET-ghc-$pkgver"

		# Rename binaries and fix links.
		local path; for path in usr/bin/"$CTARGET"-*; do
			newpath="${path//$CTARGET-/}"

			if [ -h "$path" ]; then
				target="$(readlink $path)"
				ln -sf "${target//$CTARGET-/}" "$newpath"
				rm "$path"
			else
				mv "$path" "$newpath"
			fi
		done
	fi

	# Remove triplet prefix from settings -- the intention is
	# that the native compiler will use native gcc/ld on the target.
	sed -i "s|$CTARGET-||g" "$ghclib"/settings

	# Can't do a full strip on archives.
	find . -type f \( -name "*.so" -o -name "*.a" \) \
		-exec ${CROSS_COMPILE}strip --strip-unneeded {} \;
	find $ghclib/bin -type f -exec ${CROSS_COMPILE}strip {} \;
}

# Like debian, we split apart the profiled archives/etc...
# This drastically reduces the install size of the ghc pkg.
dev() {
	pkgdesc="$pkgdesc (development files)"
	depends="$pkgname=$pkgver-r$pkgrel"

	cd "$pkgdir"

	install -dm755 "$subpkgdir"

	amove $(find . \( -type f -o -type l \) \( -name "*.p_*" -o -name "lib*_p.a" \))
}

sha512sums="
9b677d5ead5ebb5df7bc960055a76ef00e68ed8102844997b12154bf71bdbfafdfff9ca31edce86b3df759242a7c98f52a464887973b53985f54ecd9fc4b4627  ghc-9.8.2-src.tar.xz
e7766fcd98b4f70400d94ec33b39e633c2f6ab788f3b3e8431bb75e1f2a62081fc4c77e8d39b624702662168c3b5f7715d9b7866835f78d766dfa244feafe9d1  ghc-9.8.2-testsuite.tar.xz
e5961b6de84ebe5095ad77c8c94ab328a8ab652b8acf3b832e8ab3beaf11cd7b869da56231206ec7a279e4f511b991a2fab7079e34e9f7bbe0ac66001031597a  ghc-9.8.2-hadrian-ghc-9.8.2.tar.gz
1a97002ec396d532af881e712377d80748fa9f6693931d961634524cab1ef681141b0f69ef007c0c8cd404c4e673c08b254880a581eac34dcfc49daaddb97f9f  ghc-self-bootstrap.patch
be5a8639b151b7828ad50b0f63775d34411d971aae73b0fe5c0226e4c70d1ee8353545b1d04c8de7825730b6d73a2e75f855757348b5ffa2d620d20d7e57f8c6  fix-T21035.patch
28433f5e86b571ef591ee61153c804eb4a540fda120b7a7aa14f39af46eda6917361d0cd41127356e20f24cf5b9d493ae404023eae31b863c2485fb8cffa0c6a  fix-T7060.patch
"
